This R Notebook allows to reproduce the results from the article “Temporal Networks of Contrafacta in the First Three Troubadour Generations” by Stefano Milonia and Matteo Mazzamurro. All data can be found in the appropriate folder in the same GitHub project. The code is structured as follows:

  1. Packages

  2. Data

  3. Network of Songs

  4. Networks of Authors

0. Packages

A number of R packages are necessary for the smooth running of the code. The fundamental package is the “tsna” (Skye Bender-deMoll and Martina Morris (2021). tsna : Tools for Temporal Social Network Analysis. R package version 0.3.5. http://statnet.org/).

#network packages
  library(sna)
## Loading required package: statnet.common
## 
## Attaching package: 'statnet.common'
## The following object is masked from 'package:base':
## 
##     order
## Loading required package: network
## network: Classes for Relational Data
## Version 1.16.0 created on 2019-11-30.
## copyright (c) 2005, Carter T. Butts, University of California-Irvine
##                     Mark S. Handcock, University of California -- Los Angeles
##                     David R. Hunter, Penn State University
##                     Martina Morris, University of Washington
##                     Skye Bender-deMoll, University of Washington
##  For citation information, type citation("network").
##  Type help("network-package") to get started.
## sna: Tools for Social Network Analysis
## Version 2.5 created on 2019-12-09.
## copyright (c) 2005, Carter T. Butts, University of California-Irvine
##  For citation information, type citation("sna").
##  Type help(package="sna") to get started.
  library(tsna)
## Loading required package: networkDynamic
## 
## networkDynamic: version 0.10.1, created on 2020-01-16
## Copyright (c) 2020, Carter T. Butts, University of California -- Irvine
##                     Ayn Leslie-Cook, University of Washington
##                     Pavel N. Krivitsky, University of Wollongong
##                     Skye Bender-deMoll, University of Washington
##                     with contributions from
##                     Zack Almquist, University of California -- Irvine
##                     David R. Hunter, Penn State University
##                     Li Wang
##                     Kirk Li, University of Washington
##                     Steven M. Goodreau, University of Washington
##                     Jeffrey Horner
##                     Martina Morris, University of Washington
## Based on "statnet" project software (statnet.org).
## For license and citation information see statnet.org/attribution
## or type citation("networkDynamic").
  library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.1     v dplyr   1.0.6
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
  library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:purrr':
## 
##     compose, simplify
## The following object is masked from 'package:tidyr':
## 
##     crossing
## The following object is masked from 'package:tibble':
## 
##     as_data_frame
## The following objects are masked from 'package:sna':
## 
##     betweenness, bonpow, closeness, components, degree, dyad.census,
##     evcent, hierarchy, is.connected, neighborhood, triad.census
## The following objects are masked from 'package:network':
## 
##     %c%, %s%, add.edges, add.vertices, delete.edges, delete.vertices,
##     get.edge.attribute, get.edges, get.vertex.attribute, is.bipartite,
##     is.directed, list.edge.attributes, list.vertex.attributes,
##     set.edge.attribute, set.vertex.attribute
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
  library(network)
  library(networkDynamic)
  library(visNetwork)
  library(ndtv)
## Loading required package: animation
## 
## ndtv: version 0.13.0, created on 2019-05-21
## Copyright (c) 2019, Skye Bender-deMoll, University of Washington
##                     with contributions from
##                     Martina Morris, University of Washington
## Based on "statnet" project software (statnet.org).
## For license and citation information see statnet.org/attribution
## or type citation("ndtv").
  #data cleaning
  library(plyr)
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## The following object is masked from 'package:purrr':
## 
##     compact
## The following object is masked from 'package:network':
## 
##     is.discrete
  library(dplyr)
  #visuals
  library(ggplot2)
  library(ggrepel)
  library(hrbrthemes)
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
##       Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
##       if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
  library(ggpubr)
## 
## Attaching package: 'ggpubr'
## The following object is masked from 'package:plyr':
## 
##     mutate

1. Data

The raw data is taken from the Bibliografia Elettronica dei Trovatori (Asperti, S. and de Nigro, L. (2012). Bibliografia Elettronica dei Trovatori – v. 2-5-2012. Available at: http://www.bedt.it/BEdT_04_25/). The data has been checked to ensure it is temporally consistent and can be used to construct temporal networks.

contrafacta_and_analogies_with_dates<-read.csv("./data/contrafacta_and_analogies_with_dates.csv",sep=",",stringsAsFactors=FALSE)

2. Network of Songs

First construct dataframes of the links and node in the network. Links from a model song to a contrafactum are directed and are shown as solid arrows. Links between songs with metrical analogies are bidirectional and shown as dashed arrows.

  #contrafacta links
  contrafacta<-data.frame(
    "from"=contrafacta_and_analogies_with_dates$model_id,
    "to"=contrafacta_and_analogies_with_dates$contrafactum_id,
    "title"=paste(contrafacta_and_analogies_with_dates$model_id,"-->",contrafacta_and_analogies_with_dates$contrafactum_id))
  contrafacta<-na.omit(contrafacta)
  contrafacta<-distinct(contrafacta)
  contrafacta$dashes<-FALSE
  contrafacta$arrows<-"to"
  
  #metrical analogies links
  analogies<-data.frame(
    "from"=contrafacta_and_analogies_with_dates$model_id,
    "to"=contrafacta_and_analogies_with_dates$metrical_affinities_id,
    "title"=paste(contrafacta_and_analogies_with_dates$model_id,"<-->",contrafacta_and_analogies_with_dates$metrical_affinities_id))
  analogies<-na.omit(analogies)
  analogies<-distinct(analogies)
  analogies$dashes<-TRUE
  analogies$arrows="to"
  
  #dataframe of links
  links_vis<-rbind(
    contrafacta,
    analogies
  )
  links_vis$smooth<-TRUE
  
  #dataframe of nodes
  songs<-union(links_vis$from,links_vis$to)
  nodes_vis<-data.frame("id"=songs,"label"=songs)

Finally, create an interactive visualisation of the network. Songs can be selected by id or by clicking on them. When a song is selected, its neighbours (contrafacta or songs with metrical analogies) are highlighted.

#interactive visuals
  visNetwork(nodes_vis,links_vis)%>%
    visIgraphLayout(layout = "layout_with_fr") %>% 
    visOptions(
      selectedBy = list(
        "variable"="id",
        "highlight"=TRUE
      ), 
      highlightNearest=list(
        "enabled"=TRUE,
        "algorithm"="hierarchical", 
        "degree"=list(from=0,to=1),
        "labelOnly"=FALSE
      )
    ) %>%
    visLayout(randomSeed = 1234)

3. Networks of Authors

3.1 Nodes

Each node in this temporal network represent the corpus composed by an author. Thus, once an author’s node comes into existance, it continues to exist ever since. In theory, an author’s node begin to exist when he starts to compose, that is, the beginning of his activity period. Yet, temporal data about the composition of songs is often uncertain in the BdT. Occasionally, the earliest proposed composition date of a contrafactum in the BdT has been found to preceed the beginning of the activity period of the author of the model. To deal with this uncertainty and ensure that the data on the author’s activity period and the data on the composition of a contrafactum/imitation are compatible, the onset of an author’s node is fixed at the beginning of the author’s period of activity or as the earliest proposed date of composition of a contrafactum/imitation of his work, whichever is earlier.

#extract relevant data
authors_names<-na.omit(unique(c(as.vector(contrafacta_and_analogies_with_dates$model_author),as.vector(contrafacta_and_analogies_with_dates$contrafactum_author),as.vector(contrafacta_and_analogies_with_dates$metrical_affinities_author))))
authors_count<-length(authors_names)
authors_onsets<-numeric(authors_count)
for (j in 1:authors_count){
  authors_onsets[j]<-
    min(
      na.omit(c(
        contrafacta_and_analogies_with_dates$model_onset[contrafacta_and_analogies_with_dates$model_author==authors_names[j]],
        contrafacta_and_analogies_with_dates$contrafactum_onset[contrafacta_and_analogies_with_dates$contrafactum_author==authors_names[j]],
        contrafacta_and_analogies_with_dates$metrical_affinities_onset[contrafacta_and_analogies_with_dates$metrical_affinities_author==authors_names[j]]
      ))
    )
}
authors_terminus<-max(na.omit(c(
  contrafacta_and_analogies_with_dates$model_terminus,
  contrafacta_and_analogies_with_dates$contrafactum_terminus,
  contrafacta_and_analogies_with_dates$metrical_affinities_terminus
)))+1
    
#define author nodes
author_nodes<-data.frame("onset"=authors_onsets,
                             "terminus"=authors_terminus,
                             "vertex.id"=1:authors_count,
                             "onset.censored"=FALSE,
                             "terminus.censored"=FALSE,
                             "duration"=authors_terminus-authors_onsets,
                             "name"=authors_names)

3.3 Static Networks

Before we construct the temporal network, we need static networks: one containing the links due to contracta only and one containing contrafacta and as well as more general metrical analogies.

#contrafacta only
contrafacta_static<-network(
      data.frame("tail"=contrafacta_links$tail,"head"=contrafacta_links$head),
      directed = TRUE,
      multiple = FALSE,
      bipartite = FALSE
    )

#all links
all_static<-network(
      data.frame("tail"=all_links$tail,"head"=all_links$head),
      directed = TRUE,
      multiple = FALSE,
      bipartite = FALSE
    )

3.4 Temporal Networks

We can now construct the temporal networks: one containing the links due to contracta only and one containing contrafacta and as well as more general metrical analogies.

Contrafacta only:

#make temporal network 
contrafacta_dynamic <- networkDynamic(
    contrafacta_static,
    edge.spells = data.frame("onset"=contrafacta_links$onset,
                             "terminus"=contrafacta_links$terminus,
                              "tail verted.id"=contrafacta_links$tail,
                             "head vertex.id"=contrafacta_links$head
     ),
    vertex.spells = data.frame("onset"=author_nodes$onset,
                               "terminus"=author_nodes$terminus,
                               "vertex.id"=author_nodes$vertex.id
     )
  )
## Edge activity in base.net was ignored
## Created net.obs.period to describe network
##  Network observation period info:
##   Number of observation spells: 1 
##   Maximal time range observed: 1090 until 1351 
##   Temporal mode: continuous 
##   Time unit: unknown 
##   Suggested time increment: NA
#check correctness
network.dynamic.check(contrafacta_dynamic)
## $vertex.checks
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 
## $edge.checks
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [316] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [331] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [346] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [361] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [376] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [391] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [406] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [421] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [436] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [451] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [466] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [481] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [496] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [511] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [526] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [541] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [556] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [571] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 
## $dyad.checks
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [316] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [331] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [346] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [361] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [376] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [391] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [406] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [421] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [436] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [451] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [466] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [481] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [496] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [511] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [526] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [541] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [556] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [571] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 
## $vertex.tea.checks
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 
## $edge.tea.checks
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [316] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [331] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [346] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [361] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [376] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [391] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [406] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [421] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [436] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [451] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [466] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [481] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [496] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [511] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [526] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [541] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [556] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [571] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 
## $network.tea.checks
## [1] TRUE
## 
## $net.obs.period.check
## [1] TRUE

Contrafacta and analogies:

#make temporal network 
all_dynamic <- networkDynamic(
        all_static,
        edge.spells = data.frame("onset"=all_links$onset,
                                 "terminus"=all_links$terminus,
                                 "tail verted.id"=all_links$tail,
                                 "head vertex.id"=all_links$head
        ),
        vertex.spells = data.frame("onset"=author_nodes$onset,
                                   "terminus"=author_nodes$terminus,
                                   "vertex.id"=author_nodes$vertex.id
        )
      )
## Edge activity in base.net was ignored
## Created net.obs.period to describe network
##  Network observation period info:
##   Number of observation spells: 1 
##   Maximal time range observed: 1090 until 1351 
##   Temporal mode: continuous 
##   Time unit: unknown 
##   Suggested time increment: NA
#check
network.dynamic.check(all_dynamic)
## $vertex.checks
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 
## $edge.checks
##    [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [15] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [29] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [43] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [57] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [71] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [99] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [113] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [127] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [141] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [155] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [169] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [183] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [197] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [225] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [239] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [253] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [267] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [281] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [295] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [309] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [323] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [337] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [351] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [365] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [379] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [393] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [407] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [421] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [435] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [449] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [463] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [477] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [491] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [505] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [519] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [533] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [547] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [561] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [575] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [589] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [603] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [617] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [631] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [645] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [659] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [673] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [687] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [701] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [715] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [729] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [743] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [757] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [771] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [785] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [799] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [813] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [827] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [841] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [855] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [869] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [883] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [897] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [911] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [925] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [939] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [953] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [967] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [981] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [995] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [1009] TRUE TRUE TRUE
## 
## $dyad.checks
##    [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [15] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [29] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [43] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [57] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [71] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [99] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [113] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [127] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [141] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [155] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [169] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [183] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [197] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [225] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [239] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [253] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [267] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [281] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [295] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [309] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [323] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [337] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [351] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [365] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [379] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [393] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [407] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [421] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [435] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [449] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [463] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [477] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [491] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [505] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [519] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [533] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [547] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [561] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [575] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [589] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [603] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [617] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [631] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [645] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [659] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [673] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [687] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [701] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [715] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [729] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [743] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [757] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [771] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [785] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [799] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [813] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [827] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [841] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [855] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [869] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [883] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [897] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [911] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [925] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [939] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [953] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [967] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [981] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [995] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [1009] TRUE TRUE TRUE
## 
## $vertex.tea.checks
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## 
## $edge.tea.checks
##    [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [15] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [29] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [43] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [57] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [71] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##   [99] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [113] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [127] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [141] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [155] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [169] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [183] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [197] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [225] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [239] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [253] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [267] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [281] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [295] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [309] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [323] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [337] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [351] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [365] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [379] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [393] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [407] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [421] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [435] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [449] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [463] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [477] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [491] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [505] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [519] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [533] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [547] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [561] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [575] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [589] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [603] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [617] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [631] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [645] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [659] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [673] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [687] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [701] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [715] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [729] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [743] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [757] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [771] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [785] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [799] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [813] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [827] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [841] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [855] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [869] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [883] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [897] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [911] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [925] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [939] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [953] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [967] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [981] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [995] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [1009] TRUE TRUE TRUE
## 
## $network.tea.checks
## [1] TRUE
## 
## $net.obs.period.check
## [1] TRUE

Example of application: comptute forward and backward reachability

#contrafacta only 
fwd_reach_contrafacta_only <- tReach(contrafacta_dynamic)
bkwd_reach_contrafacta_only <- tReach(contrafacta_dynamic, direction = "bkwd")
#save as dataframe
contrafacta_fwd_bkwd<-data.frame("fwd"=fwd_reach_contrafacta_only,"bkwd"=bkwd_reach_contrafacta_only,"author_name"=authors_names)

#all links
fwd_reach_all_contrafacta <- tReach(all_dynamic)
bkwd_reach_all_contrafacta <- tReach(all_dynamic, direction = "bkwd")
#save as dataframe
all_fwd_bkwd<-data.frame("fwd"=fwd_reach_all_contrafacta,"bkwd"=bkwd_reach_all_contrafacta,"author_name"=authors_names)

3.5 Analysis and Visuals

We can finally compute node-related measures for our temporal networks and create visualisations to assist their analysis.

3.5.1 Animated plots

First, we create animated plots that show when links are created.

Contrafacta only:

#calculate how to plot animated version
      compute.animation(
        contrafacta_dynamic,
        animation.mode = "kamadakawai",
        slice.par = list(
          start = 1130,
          end = 1332,
          interval = 10,
          aggregate.dur = 20,
          rule = "latest"
        )
      )
## Calculating layout for network slice from time  1130 to 1150
## Calculating layout for network slice from time  1140 to 1160
## Calculating layout for network slice from time  1150 to 1170
## Calculating layout for network slice from time  1160 to 1180
## Calculating layout for network slice from time  1170 to 1190
## Calculating layout for network slice from time  1180 to 1200
## Calculating layout for network slice from time  1190 to 1210
## Calculating layout for network slice from time  1200 to 1220
## Calculating layout for network slice from time  1210 to 1230
## Calculating layout for network slice from time  1220 to 1240
## Calculating layout for network slice from time  1230 to 1250
## Calculating layout for network slice from time  1240 to 1260
## Calculating layout for network slice from time  1250 to 1270
## Calculating layout for network slice from time  1260 to 1280
## Calculating layout for network slice from time  1270 to 1290
## Calculating layout for network slice from time  1280 to 1300
## Calculating layout for network slice from time  1290 to 1310
## Calculating layout for network slice from time  1300 to 1320
## Calculating layout for network slice from time  1310 to 1330
## Calculating layout for network slice from time  1320 to 1340
## Calculating layout for network slice from time  1330 to 1350
      #Render the animation and open it in a web brower
      render.d3movie(
        contrafacta_dynamic,
        displaylabels = FALSE,
        output.mode = 'htmlWidget'
      )
## caching 10 properties for slice 0
## caching 10 properties for slice 1
## caching 10 properties for slice 2
## caching 10 properties for slice 3
## caching 10 properties for slice 4
## caching 10 properties for slice 5
## caching 10 properties for slice 6
## caching 10 properties for slice 7
## caching 10 properties for slice 8
## caching 10 properties for slice 9
## caching 10 properties for slice 10
## caching 10 properties for slice 11
## caching 10 properties for slice 12
## caching 10 properties for slice 13
## caching 10 properties for slice 14
## caching 10 properties for slice 15
## caching 10 properties for slice 16
## caching 10 properties for slice 17
## caching 10 properties for slice 18
## caching 10 properties for slice 19
## caching 10 properties for slice 20
## loading ndtv-d3 animation widget...

Contrafacta and analogies:

 #calculate how to plot animated version
      compute.animation(
        all_dynamic,
        animation.mode = "kamadakawai",
        slice.par = list(
          start = 1190,
          end = 1332,
          interval = 5,
          aggregate.dur = 5,
          rule = "latest"
        )
      )
## Calculating layout for network slice from time  1190 to 1195
## Calculating layout for network slice from time  1195 to 1200
## Calculating layout for network slice from time  1200 to 1205
## Calculating layout for network slice from time  1205 to 1210
## Calculating layout for network slice from time  1210 to 1215
## Calculating layout for network slice from time  1215 to 1220
## Calculating layout for network slice from time  1220 to 1225
## Calculating layout for network slice from time  1225 to 1230
## Calculating layout for network slice from time  1230 to 1235
## Calculating layout for network slice from time  1235 to 1240
## Calculating layout for network slice from time  1240 to 1245
## Calculating layout for network slice from time  1245 to 1250
## Calculating layout for network slice from time  1250 to 1255
## Calculating layout for network slice from time  1255 to 1260
## Calculating layout for network slice from time  1260 to 1265
## Calculating layout for network slice from time  1265 to 1270
## Calculating layout for network slice from time  1270 to 1275
## Calculating layout for network slice from time  1275 to 1280
## Calculating layout for network slice from time  1280 to 1285
## Calculating layout for network slice from time  1285 to 1290
## Calculating layout for network slice from time  1290 to 1295
## Calculating layout for network slice from time  1295 to 1300
## Calculating layout for network slice from time  1300 to 1305
## Calculating layout for network slice from time  1305 to 1310
## Calculating layout for network slice from time  1310 to 1315
## Calculating layout for network slice from time  1315 to 1320
## Calculating layout for network slice from time  1320 to 1325
## Calculating layout for network slice from time  1325 to 1330
## Calculating layout for network slice from time  1330 to 1335
      #Render the animation and open it in a web brower
      render.d3movie(
        all_dynamic,
        displaylabels = FALSE,
        output.mode = 'htmlWidget',#,
        #This slice function makes the labels work
        vertex.tooltip = function(slice) {
          paste(
            "<b>ID:</b>", (slice %v% "name"))
        }
      )
## caching 10 properties for slice 0
## caching 10 properties for slice 1
## caching 10 properties for slice 2
## caching 10 properties for slice 3
## caching 10 properties for slice 4
## caching 10 properties for slice 5
## caching 10 properties for slice 6
## caching 10 properties for slice 7
## caching 10 properties for slice 8
## caching 10 properties for slice 9
## caching 10 properties for slice 10
## caching 10 properties for slice 11
## caching 10 properties for slice 12
## caching 10 properties for slice 13
## caching 10 properties for slice 14
## caching 10 properties for slice 15
## caching 10 properties for slice 16
## caching 10 properties for slice 17
## caching 10 properties for slice 18
## caching 10 properties for slice 19
## caching 10 properties for slice 20
## caching 10 properties for slice 21
## caching 10 properties for slice 22
## caching 10 properties for slice 23
## caching 10 properties for slice 24
## caching 10 properties for slice 25
## caching 10 properties for slice 26
## caching 10 properties for slice 27
## caching 10 properties for slice 28
## loading ndtv-d3 animation widget...

3.5.2 Compare forward and backward reachability

The following code generates plot comparing the forward and backward reachability of each author. Authors with exceptionally large forward or backward reachability are labelled for convenience.

Contrafacta only:

 ggplot(contrafacta_fwd_bkwd, aes(x=fwd,y=bkwd))+
      geom_point(color="black", position = "jitter")+#, size=sqrt(data$count)*2)+
      geom_label_repel(
        data=contrafacta_fwd_bkwd %>% filter(fwd>60 | bkwd>27 | (fwd>27 & bkwd>10)),
        aes(label=author_name),
        #nudge_x = 1, nudge_y = 0.5, 
        check_overlap = T
      )+
      theme_ipsum(
        axis_title_size = 12,
        axis_text_size = 11,
        plot_margin = margin(0, 0, 0, 0),
        grid_col = "#cccccc",
        grid = TRUE,
        axis_col = "#000000",
        axis = TRUE,
        ticks = FALSE
      )+
      theme(
        plot.title = element_text(size=15),
        axis.title = element_text(size=10,vjust=0.5),
        panel.grid.major.x=element_blank(),
        panel.grid.minor.x=element_blank()
      ) +
      ggtitle("Backward- vs Forward-Reachable Sets (Contrafacta)")+
      ylab("size of backward-reachable set")+
      xlab("size of forward-reachable set")+
      scale_x_continuous(breaks=seq(0,130,by=10))
## Warning: Ignoring unknown parameters: check_overlap
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

Contrafacta and analogies:

ggplot(all_fwd_bkwd, aes(x=fwd,y=bkwd))+
      geom_point(color="black", position = "jitter")+
      geom_label_repel(
        data=all_fwd_bkwd %>% filter(fwd>265 | bkwd>90 | (fwd>250 & bkwd>70)),
        aes(label=author_name),
        #nudge_x = 1, nudge_y = 0.5, 
        check_overlap = T
      )+
      theme_ipsum(
        axis_title_size = 12,
        axis_text_size = 11,
        plot_margin = margin(0, 0, 0, 0),
        grid_col = "#cccccc",
        grid = TRUE,
        axis_col = "#000000",
        axis = TRUE,
        ticks = FALSE
      )+
      theme(
        plot.title = element_text(size=15),
        axis.title = element_text(size=10,vjust=0.5),
        panel.grid.major.x=element_blank(),
        panel.grid.minor.x=element_blank()
      ) +
      ggtitle("Backward- vs Forward-Reachable Sets (Contrafacta and Analogies)")+
      ylab("size of backward-reachable set")+
      xlab("size of forward-reachable set")+
      scale_x_continuous(breaks=seq(0,270,by=15))
## Warning: Ignoring unknown parameters: check_overlap
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

3.5.3 Network visualisation and analysis function

The following function can be used for both analysis and visualisation. It uses igraph for the graph analysis and visNetwork for its visualisation The function takes 4 arguments:

  1. analogies: TRUE/FALSE whether to include analogies links in the network or not (just contrafacta).

  2. type_size: the measure to be represented as node size. For possible measures, see below.

  3. type_colour: the measure to be represented as node colour For measures, see below.

  4. visual: TRUE/FALSE whether the result should be a plot or a dataframe with the required measures. The FALSE option is helpful for saving data for future analysis.

Possible choices of measures:

  1. “in degree”

  2. “out degree”

  3. “betweenness static”, i.e. the betweenness computed ignoring temporal information

  4. “betweenness dynamic”, i.e. the betweenness computed including temporal information

  5. “closeness static”

  6. “closeness dynamic”

  7. “reachable”, i.e. the size of the forward reachability set ignoring tempporal information

  8. “temporal reachable” i.e. the size of the forward reachability set including tempporal information

Remark: The computation of the betweenness dynamic is quite slow. It might take a few minutes.

First, define helpful links dataframes (this alternative format is required when using igraph)

#contrafacta only
contrafacta_links_2<-data.frame(
    "from"=contrafacta_links$tail,
    "to"=contrafacta_links$head,
    "head_label"=contrafacta_links$head_label,
    "head_onset"=contrafacta_links$head_onset,
    "head_terminus"=contrafacta_links$head_terminus,
    "tail_label"= contrafacta_links$tail_label,
    "tail_onset"=contrafacta_links$tail_onset,
    "tail_terminus"=contrafacta_links$tail_terminus,
    "dashes"=!contrafacta_links$repsec)
#clean dataframe and add labels
contrafacta_links_2<-na.omit(contrafacta_links_2)
contrafacta_links_2<-distinct(contrafacta_links_2,from,to,head_label,tail_label,.keep_all = TRUE)
contrafacta_links_2$title<-paste(contrafacta_links_2$tail_label,
                                    " (",
                                    contrafacta_links_2$tail_onset,
                                    "-",
                                    contrafacta_links_2$tail_terminus,
                                    ")->",
                                    contrafacta_links_2$head_label,
                                    " (",
                                    contrafacta_links_2$head_onset,
                                    "-",
                                    contrafacta_links_2$head_terminus,
                                    ")",sep="")
contrafacta_links_2$arrows<-"to"

#contrafacta and metrical analogies  
all_links_2<-data.frame(
    "from"=all_links$tail,
    "to"=all_links$head,
    "head_label"=all_links$head_label,
    "head_onset"=all_links$head_onset,
    "head_terminus"=all_links$head_terminus,
    "tail_label"= all_links$tail_label,
    "tail_onset"=all_links$tail_onset,
    "tail_terminus"=all_links$tail_terminus,
    "dashes"=!all_links$repsec)
all_links_2<-na.omit(all_links_2)
all_links_2<-distinct(all_links_2,from,to,head_label,tail_label,.keep_all = TRUE)
all_links_2$title<-paste(all_links_2$tail_label,
                                 " (",
                                 all_links_2$tail_onset,
                                 "-",
                                 all_links_2$tail_terminus,
                                 ") ->",
                                 all_links_2$head_label,
                                 " (",
                                 all_links_2$head_onset,
                                 "-",
                                 all_links_2$head_terminus,
                                 ")",sep="")
all_links_2$arrows="to"

Finally, the function

 final_network_with_colour<-function(analogies,type_size,type_colour,visual){
      #define nodes
      {
        nodes_vis<-data.frame(id=author_nodes$vertex.id,label=author_nodes$name)
      }
      #define edges
      {
        if(analogies){
          edges_vis<-all_links_2
          static_network<-all_static
          dynamic_network<-all_dynamic
          
        }else{
          edges_vis<-contrafacta_links_2
          static_network<-contrafacta_static
          dynamic_network<-contrafacta_dynamic
        }
        edges_vis$smooth<-FALSE
      }
      #define igraph object
      {
        static_network_igraph<-graph_from_data_frame(edges_vis, directed = TRUE, vertices=nodes_vis)
      }
      #compute node measures
      {
        if (type_size=="in degree"|| type_colour=="in degree"){
          nodes_vis$in_degree<-igraph::degree(static_network_igraph,mode="in")
        }
        if (type_size=="out degree" || type_colour=="out degree") {
          nodes_vis$out_degree<-igraph::degree(static_network_igraph,mode="out")
        }
        if (type_size=="betweenness static" || type_colour=="betweenness static"){
          nodes_vis$betweenness_static<-betweenness(static_network)/max(betweenness(static_network))*50
        }
        if (type_size=="betweenness dynamic" || type_colour=="betweenness dynamic"){
          #temporal betweenness function
          {
            #inputs: a starting node i and a final node j
            #outputs: number of temporally valid paths from i to j and the number of such paths passing through author/node k for each author
            n_paths_from_i_to_j<-function(i,j){
              #find all paths in from i to j
              all_paths<-all_shortest_paths(static_network_igraph,from=i,to=j)$res
              valid_paths<-list()
              valid_paths_with_k<-numeric(authors_count)
              n=1
              #for each path, verify that the path is temporally valid 
              #i.e., if the time of appearance of the directed links along the path is sorted
              for (p in all_paths) {
                p_data_frame<-data.frame(
                  from=as.numeric(p[1:(length(p)-1)]),
                  to=as.numeric(p[2:(length(p))])
                ) 
                p_data_frame<-join(p_data_frame,edges_vis,by=c("from","to"))
                p_valid<-!is.unsorted(p_data_frame$onset)
                #for each valid path, check if it passes through author/node k
                if(p_valid){
                  valid_paths[[n]]<-p
                  n<-n+1
                  for (k in 1:authors_count){
                    valid_paths_with_k[k]<-ifelse(k %in% p, valid_paths_with_k[k]+1,valid_paths_with_k[k])
                  }
                }
              }
              valid_and_k_valid<-list("valid"=length(valid_paths),"k_valid"=valid_paths_with_k)
              return(valid_and_k_valid)
            }
          }
          #computation
          {
            #initialise matrices
            n_paths_ijk<-array(NA,dim=c(authors_count,authors_count,authors_count))
            n_paths_ij<-matrix(NA,nrow=authors_count,ncol=authors_count)
            
            #find number of valid paths for each apir (i,j) and for all values of k
            for (i in 1:authors_count) {
              for (j in 1:authors_count) {
                if (!i==j){
                  paths_info_ij<-n_paths_from_i_to_j(i,j)
                  n_paths_ij[i,j]<-paths_info_ij$valid
                  n_paths_ijk[i,j,]<-paths_info_ij$k_valid
                }
              }
              print(i)
            }
            
            #compute betweenness for each value k
            temporal_betwenness_values<-numeric(authors_count)
            diag(n_paths_ij)<-1
            for (k in 1:authors_count){
              n_paths_ij_k<-n_paths_ij
              n_paths_ijk_k<-n_paths_ijk[,,k]
              diag(n_paths_ijk_k)<-0
              n_paths_ijk_k<-n_paths_ijk_k[-k,-k]
              n_paths_ij_k<-n_paths_ij_k[-k,-k]
              ratio_matrix<-n_paths_ijk_k/n_paths_ij_k
              temporal_betwenness_values[k]<-sum(ratio_matrix,na.rm=TRUE)
            }
          }
          #assign betweenness to each node
          nodes_vis$betweenness_dynamic<-temporal_betwenness_values
        }
        if (type_size=="closeness static" || type_colour=="closeness static"){
          out_harmon_static<-numeric(authors_count)
          static_network_distances<-distances(static_network_igraph, v = V(static_network_igraph), to = V(static_network_igraph), mode = "out", weights = NULL, algorithm = "dijkstra")
          for(i in 1:authors_count){
            out_harmon_static[i]<-sum(1/static_network_distances[i,-i])
          }
          nodes_vis$out_harmonic_closeness_static<-out_harmon_static
        }
        if (type_size=="closeness dynamic" || type_colour=="closeness dynamic"){
          out_harmon_dynamic<-numeric(312)
          dynamic_network_distances<-matrix(NA,nrow=312,ncol=312)
          for (i in 1:312){
            dynamic_network_distances[i,]<-tPath(dynamic_network, v = i,direction ="fwd")$gsteps
          }
          for(i in 1:312){
            out_harmon_dynamic[i]<-sum(1/dynamic_network_distances[i,-i])
          }
          nodes_vis$out_harmonic_closeness_dynamic<-out_harmon_dynamic
        }
        if (type_size=="reachable" || type_colour=="reachable"){
          nodes_vis$reachable_set_size<-rowSums(reachability(static_network))
        }
        if (type_size=="temporal reachable" || type_colour=="temporal reachable"){
          nodes_vis$temporal_reachable_set_size<-tReach(dynamic_network)
        }
      }
      #visuals
      {
        set.seed(1234)
        colfunc<-colorRampPalette(c("#333333",ifelse(analogies,"orange","red"),"white"))
        highlightnearestvalues<-list(
          "enabled"=TRUE,
          "algorithm"="hierarchical", 
          "degree"=list(from=0,to=0),
          "labelOnly"=FALSE
        )
        
        if (type_colour=="none"){
          nodes_vis$color<-"black"
        }
        else if (type_colour=="in degree"){
          color_distance<-colfunc(max(nodes_vis$in_degree)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$in_degree)+1]
          highlightnearestvalues<-list(
            "enabled"=TRUE,
            "algorithm"="hierarchical", 
            "degree"=list(from=1,to=0),
            "labelOnly"=FALSE
          )
        }
        else if (type_colour=="out degree"){
          color_distance<-colfunc(max(nodes_vis$out_degree)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$out_degree)+1]
          highlightnearestvalues<-list(
            "enabled"=TRUE,
            "algorithm"="hierarchical", 
            "degree"=list(from=0,to=1),
            "labelOnly"=FALSE
          )
        }
        else if (type_colour=="betweenness static"){
          color_distance<-colfunc(max(nodes_vis$betweenness_static)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$betweenness_static)+1]
        }
        else if (type_colour=="betweenness dynamic"){
          color_distance<-colfunc(max(nodes_vis$betweenness_dynamic)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$betweenness_dynamic)+1]
        }
        else if (type_colour=="closeness static"){
          color_distance<-colfunc(max(nodes_vis$out_harmonic_closeness_static)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$out_harmonic_closeness_static)+1]
        }
        else if (type_colour=="closeness dynamic"){
          color_distance<-colfunc(max(nodes_vis$out_harmonic_closeness_dynamic)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$out_harmonic_closeness_dynamic)+1]
        }
        else if (type_colour=="reachable"){
          color_distance<-colfunc(max(nodes_vis$reachable_set_size)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$reachable_set_size)+1]
          highlightnearestvalues<-list(
            "enabled"=TRUE,
            "algorithm"="hierarchical", 
            "degree"=list(from=0,to=12),
            "labelOnly"=FALSE
          )
        }
        else if (type_colour=="temporal reachable"){
          color_distance<-colfunc(max(nodes_vis$temporal_reachable_set_size)+1)
          nodes_vis$color<-color_distance[floor(nodes_vis$temporal_reachable_set_size)+1]
        }
        
        if (type_size=="none"){
          nodes_vis$value<-1
        }
        else if (type_size=="in degree"){
          nodes_vis$value<-nodes_vis$in_degree+1
          highlightnearestvalues<-list(
            "enabled"=TRUE,
            "algorithm"="hierarchical", 
            "degree"=list(from=1,to=0),
            "labelOnly"=FALSE
          )
        }
        else if (type_size=="out degree"){
          nodes_vis$value<-nodes_vis$out_degree+1
          highlightnearestvalues<-list(
            "enabled"=TRUE,
            "algorithm"="hierarchical", 
            "degree"=list(from=0,to=1),
            "labelOnly"=FALSE
          )
        }
        else if (type_size=="betweenness static"){
          nodes_vis$value<-floor(nodes_vis$betweenness_static)+1
        }
        else if (type_size=="betweenness dynamic"){
          nodes_vis$value<-floor(nodes_vis$betweenness_dynamic)+1
        }
        else if (type_size=="closeness static"){
          nodes_vis$value<-floor(nodes_vis$out_harmonic_closeness_static)+1
        }
        else if (type_size=="closeness dynamic"){
          nodes_vis$value<-floor(nodes_vis$out_harmonic_closeness_dynamic)+1
        }
        else if (type_size=="reachable"){
          nodes_vis$value<-floor(nodes_vis$reachable_set_size)+1
          highlightnearestvalues<-list(
            "enabled"=TRUE,
            "algorithm"="hierarchical", 
            "degree"=list(from=0,to=12),
            "labelOnly"=FALSE
          )
        }
        else if (type_size=="temporal reachable"){
          nodes_vis$value<-floor(nodes_vis$temporal_reachable_set_size)+1
        }
        
        p<-visNetwork(nodes_vis,edges_vis)%>%
          visIgraphLayout(layout = "layout_with_fr") %>% 
          visOptions(
            selectedBy = list(
              "variable"="label",
              "highlight"=TRUE
            ), 
            highlightNearest=highlightnearestvalues
          ) %>%
          visLayout(randomSeed = 1234)
        if(visual){         
          return(p)
        }
        else {
          return(nodes_vis)
        }
      }
    }

Here are a few example of the visuals:

  1. All links, size of the node is its out-degree, colour is its in-degree
final_network_with_colour(TRUE,"out degree","in degree",TRUE)

2) All links, size of the node is its out-degree, colour is its temporal reachability

final_network_with_colour(TRUE,"out degree","temporal reachable",TRUE)

3) All links, size of the node is its reachability, ignoring temporal information, colour is its temporal reachability

final_network_with_colour(TRUE,"reachable","temporal reachable",TRUE)

4) Contrafacta only, size of the node is its out-degree, colour is its in-degree

final_network_with_colour(FALSE,"out degree","in degree",TRUE)

5) All links, size of the node is its betweenness, colour is its closeness, both computed taking temporal information info account

final_network_with_colour(TRUE,"betweenness dynamic","closeness dynamic",TRUE)
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
## [1] 18
## [1] 19
## [1] 20
## [1] 21
## [1] 22
## [1] 23
## [1] 24
## [1] 25
## [1] 26
## [1] 27
## [1] 28
## [1] 29
## [1] 30
## [1] 31
## [1] 32
## [1] 33
## [1] 34
## [1] 35
## [1] 36
## [1] 37
## [1] 38
## [1] 39
## [1] 40
## [1] 41
## [1] 42
## [1] 43
## [1] 44
## [1] 45
## [1] 46
## [1] 47
## [1] 48
## [1] 49
## [1] 50
## [1] 51
## [1] 52
## [1] 53
## [1] 54
## [1] 55
## [1] 56
## [1] 57
## [1] 58
## [1] 59
## [1] 60
## [1] 61
## [1] 62
## [1] 63
## [1] 64
## [1] 65
## [1] 66
## [1] 67
## [1] 68
## [1] 69
## [1] 70
## [1] 71
## [1] 72
## [1] 73
## [1] 74
## [1] 75
## [1] 76
## [1] 77
## [1] 78
## [1] 79
## [1] 80
## [1] 81
## [1] 82
## [1] 83
## [1] 84
## [1] 85
## [1] 86
## [1] 87
## [1] 88
## [1] 89
## [1] 90
## [1] 91
## [1] 92
## [1] 93
## [1] 94
## [1] 95
## [1] 96
## [1] 97
## [1] 98
## [1] 99
## [1] 100
## [1] 101
## [1] 102
## [1] 103
## [1] 104
## [1] 105
## [1] 106
## [1] 107
## [1] 108
## [1] 109
## [1] 110
## [1] 111
## [1] 112
## [1] 113
## [1] 114
## [1] 115
## [1] 116
## [1] 117
## [1] 118
## [1] 119
## [1] 120
## [1] 121
## [1] 122
## [1] 123
## [1] 124
## [1] 125
## [1] 126
## [1] 127
## [1] 128
## [1] 129
## [1] 130
## [1] 131
## [1] 132
## [1] 133
## [1] 134
## [1] 135
## [1] 136
## [1] 137
## [1] 138
## [1] 139
## [1] 140
## [1] 141
## [1] 142
## [1] 143
## [1] 144
## [1] 145
## [1] 146
## [1] 147
## [1] 148
## [1] 149
## [1] 150
## [1] 151
## [1] 152
## [1] 153
## [1] 154
## [1] 155
## [1] 156
## [1] 157
## [1] 158
## [1] 159
## [1] 160
## [1] 161
## [1] 162
## [1] 163
## [1] 164
## [1] 165
## [1] 166
## [1] 167
## [1] 168
## [1] 169
## [1] 170
## [1] 171
## [1] 172
## [1] 173
## [1] 174
## [1] 175
## [1] 176
## [1] 177
## [1] 178
## [1] 179
## [1] 180
## [1] 181
## [1] 182
## [1] 183
## [1] 184
## [1] 185
## [1] 186
## [1] 187
## [1] 188
## [1] 189
## [1] 190
## [1] 191
## [1] 192
## [1] 193
## [1] 194
## [1] 195
## [1] 196
## [1] 197
## [1] 198
## [1] 199
## [1] 200
## [1] 201
## [1] 202
## [1] 203
## [1] 204
## [1] 205
## [1] 206
## [1] 207
## [1] 208
## [1] 209
## [1] 210
## [1] 211
## [1] 212
## [1] 213
## [1] 214
## [1] 215
## [1] 216
## [1] 217
## [1] 218
## [1] 219
## [1] 220
## [1] 221
## [1] 222
## [1] 223
## [1] 224
## [1] 225
## [1] 226
## [1] 227
## [1] 228
## [1] 229
## [1] 230
## [1] 231
## [1] 232
## [1] 233
## [1] 234
## [1] 235
## [1] 236
## [1] 237
## [1] 238
## [1] 239
## [1] 240
## [1] 241
## [1] 242
## [1] 243
## [1] 244
## [1] 245
## [1] 246
## [1] 247
## [1] 248
## [1] 249
## [1] 250
## [1] 251
## [1] 252
## [1] 253
## [1] 254
## [1] 255
## [1] 256
## [1] 257
## [1] 258
## [1] 259
## [1] 260
## [1] 261
## [1] 262
## [1] 263
## [1] 264
## [1] 265
## [1] 266
## [1] 267
## [1] 268
## [1] 269
## [1] 270
## [1] 271
## [1] 272
## [1] 273
## [1] 274
## [1] 275
## [1] 276
## [1] 277
## [1] 278
## [1] 279
## [1] 280
## [1] 281
## [1] 282
## [1] 283
## [1] 284
## [1] 285
## [1] 286
## [1] 287
## [1] 288
## [1] 289
## [1] 290
## [1] 291
## [1] 292
## [1] 293
## [1] 294
## [1] 295
## [1] 296
## [1] 297
## [1] 298
## [1] 299
## [1] 300
## [1] 301
## [1] 302
## [1] 303
## [1] 304
## [1] 305
## [1] 306
## [1] 307
## [1] 308
## [1] 309
## [1] 310
## [1] 311
## [1] 312

3.5.4 Author reachability

The following function allows to visualise the temporally consistent paths in the network starting from or ending in a node. These represent the authors who might have influenced or might have been influenced by a given author.

The function takes as inputs:

  1. author: an author’s name or id,

  2. analogies: TRUE/FALSE, whether analogies should be included or only contrafacta,

  3. temporal: TRUE/FALSE if temporally consistent paths only should be considered,

  4. forward: TRUE/FALSE if forward paths or backward paths should be considered.

path_by_author=function(author,analogies,temporal,forward){
        #define nodes
        {
          nodes_vis<-data.frame(id=author_nodes$vertex.id,label=author_nodes$name)
        }
        #define edges
        {
          if(analogies){
            edges_vis<-all_links_2
            static_network<-all_static
            dynamic_network<-all_dynamic
          }else{
            edges_vis<-contrafacta_links_2
            static_network<-contrafacta_static
            dynamic_network<-contrafacta_dynamic
          }
          edges_vis$smooth<-TRUE
        }
        #define igraph object and compute distances
        {
          static_network_igraph<-graph_from_data_frame(edges_vis, directed = TRUE, vertices=nodes_vis)
          static_distances<-distances(static_network_igraph, v = V(static_network_igraph), to = V(static_network_igraph), mode = "out", weights = NULL, algorithm = "dijkstra")
        }
        #find id if author given as name
        {
          author_id<-ifelse(is.numeric(author),author,author_nodes$vertex.id[author_nodes$name==author])
          author_id<-as.numeric(author_id)
        }
        #define group
        {
          if (temporal){
            if(forward){
              nodes_steps<-tPath(
                dynamic_network,
                v = author_id,
                direction ="fwd"
              )$gsteps
            } else {
              nodes_steps<-tPath(
                dynamic_network,
                v = author_id,
                direction ="bkwd",
                type="latest.depart"
              )$gsteps
            }
            nodes_vis$group<-as.character(nodes_steps) 
          }else{
            nodes_vis$group<-as.character(as.vector(static_distances[author_id,]))
          }
        }
        #visuals
        {
          colfunc<-colorRampPalette(c("white",ifelse(analogies,"orange","red"),"black"))
          color_distance<-colfunc(10)
          set.seed(1234)
          
          visNetwork(nodes_vis,edges_vis)%>%
            visIgraphLayout(layout = "layout_with_fr") %>% 
            visGroups(groupname = "0",color=color_distance[1]) %>%
            visGroups(groupname = "1",color=color_distance[2]) %>%
            visGroups(groupname = "2", color=color_distance[3])%>%
            visGroups(groupname = "3", color=color_distance[4])%>%
            visGroups(groupname = "4", color=color_distance[5])%>%
            visGroups(groupname = "5", color=color_distance[6])%>%
            visGroups(groupname = "6", color=color_distance[7])%>%
            visGroups(groupname = "7", color=color_distance[8])%>%
            visGroups(groupname = "8", color=color_distance[9])%>%
            visGroups(groupname = "9", color=color_distance[10])%>%
            visGroups(groupname = "Inf", color="#333333")%>%
            visOptions(
              selectedBy = list(
                "variable"="label",
                "highlight"=TRUE
              ), 
              highlightNearest=list(
                "enabled"=TRUE,
                "algorithm"="hierarchical", 
                "degree"=list(from=0,to=0),
                "labelOnly"=FALSE
              )
            ) %>%
            visLayout(randomSeed = 1234)
        }
        
      }

Example: termporally consistent forward paths for Elias de Barjols, including analogies as well as contrafacta.

path_by_author("Elias de Barjols",TRUE,TRUE,TRUE)

3.6 Robustness of the analysis

There is considerable uncertainty regarding the time of composition of a contrafactum or other imitation. The composition time is generally given as an interval [t1,t2] in the BdT and a choice has to be made about what value t in [t1,t2] should be taken as the onset time of the links in the temporal networks. This code shows the degree distribution and the reachability sets obtained when t is chosen to be t=t1, t=(t1+t2)/2, or t=t2. Although differences are visible, the correlation between the degree distributions as well as the correlation of the size of the reachability sets obtained when comparing any two of these choices is very high and significant. This indicates that the analysis is robust.

  #degree data
  contrafacta_degree_beginning<-read.csv("./robustness_results/contrafacta_degree_beginning.csv",stringsAsFactors = FALSE)
  all_degree_beginning<-read.csv("./robustness_results/all_degree_beginning.csv",stringsAsFactors = FALSE)
  
  contrafacta_degree_average<-read.csv("./robustness_results/contrafacta_degree_average.csv",stringsAsFactors = FALSE)
  all_degree_average<-read.csv("./robustness_results/all_degree_average.csv",stringsAsFactors = FALSE)
  
  contrafacta_degree_end<-read.csv("./robustness_results/contrafacta_degree_end.csv",stringsAsFactors = FALSE)
  all_degree_end<-read.csv("./robustness_results/all_degree_end.csv",stringsAsFactors = FALSE)
  
  #example correlation tests
  cor.test(contrafacta_degree_beginning$in_degree, contrafacta_degree_average$in_degree, method = c("pearson", "kendall", "spearman"))
## 
##  Pearson's product-moment correlation
## 
## data:  contrafacta_degree_beginning$in_degree and contrafacta_degree_average$in_degree
## t = 294.91, df = 310, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9977790 0.9985776
## sample estimates:
##       cor 
## 0.9982225
  #fwd/bkwd paths data
  contrafacta_fwd_bkwd_beginning<-read.csv("./robustness_results/contrafacta_fwd_bkwd_beginning.csv")
  all_fwd_bkwd_beginning<-read.csv("./robustness_results/all_fwd_bkwd_beginning.csv")
  
  contrafacta_fwd_bkwd_average<-read.csv("./robustness_results/contrafacta_fwd_bkwd_average.csv")
  all_fwd_bkwd_average<-read.csv("./robustness_results/all_fwd_bkwd_average.csv")
  
  contrafacta_fwd_bkwd_end<-read.csv("./robustness_results/contrafacta_fwd_bkwd_end.csv")
  all_fwd_bkwd_end<-read.csv("./robustness_results/all_fwd_bkwd_end.csv")
  
  #example correlation tests
  cor.test(contrafacta_fwd_bkwd_beginning$fwd, contrafacta_fwd_bkwd_average$fwd, method = c("pearson", "kendall", "spearman"))
## 
##  Pearson's product-moment correlation
## 
## data:  contrafacta_fwd_bkwd_beginning$fwd and contrafacta_fwd_bkwd_average$fwd
## t = 135.46, df = 310, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9895861 0.9933207
## sample estimates:
##      cor 
## 0.991659
  cor.test(contrafacta_fwd_bkwd_beginning$fwd, contrafacta_fwd_bkwd_end$fwd, method = c("pearson", "kendall", "spearman"))
## 
##  Pearson's product-moment correlation
## 
## data:  contrafacta_fwd_bkwd_beginning$fwd and contrafacta_fwd_bkwd_end$fwd
## t = 101, df = 310, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9814653 0.9880946
## sample estimates:
##       cor 
## 0.9851425
  cor.test(all_fwd_bkwd_beginning$fwd, all_fwd_bkwd_average$fwd, method = c("pearson", "kendall", "spearman"))
## 
##  Pearson's product-moment correlation
## 
## data:  all_fwd_bkwd_beginning$fwd and all_fwd_bkwd_average$fwd
## t = 63.287, df = 310, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9544797 0.9706179
## sample estimates:
##      cor 
## 0.963412
  cor.test(all_fwd_bkwd_beginning$fwd, all_fwd_bkwd_end$fwd, method = c("pearson", "kendall", "spearman"))
## 
##  Pearson's product-moment correlation
## 
## data:  all_fwd_bkwd_beginning$fwd and all_fwd_bkwd_end$fwd
## t = 41.936, df = 310, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9034926 0.9371255
## sample estimates:
##       cor 
## 0.9220307
  #example correlation plots
  my_data<-data.frame("fwd1"=contrafacta_fwd_bkwd_beginning$fwd,"fwd2"=contrafacta_fwd_bkwd_end$fwd)
  ggscatter(my_data, x = "fwd1", y = "fwd2", 
            add = "reg.line", conf.int = TRUE, 
            cor.coef = TRUE, cor.method = "pearson",
            xlab = "fwd_reachability", ylab = "fwd_reachability")
## `geom_smooth()` using formula 'y ~ x'